home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
EnigmA Amiga Run 1996 February
/
EnigmA AMIGA RUN 04 (1996)(G.R. Edizioni)(IT)[!][issue 1996-02][Skylink CD III].iso
/
earcd
/
comm2
/
kms20src.lha
/
KMSC
/
datei.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-04-01
|
55KB
|
2,304 lines
/**********************************
* KMS *
**********************************
* ©1992 by BlackMagic Software *
**********************************
* *
**********************************/
#include <KMS/KMS.h>
#include <KMS/KMS_devlib.h>
Prototype LONG DirWork(STRPTR, STRPTR, UWORD);
Prototype BOOL Exists(STRPTR);
Prototype BOOL DirExists(STRPTR);
Prototype BOOL SendFile(STRPTR, UWORD);
Prototype VOID LogEntry(STRPTR);
Prototype VOID SysMsg(UWORD);
Prototype STRPTR GetSysMsgLine(STRPTR, STRPTR, UWORD);
Prototype VOID TrimString(STRPTR);
Prototype VOID SystemError(STRPTR, STRPTR);
Prototype VOID FileError(STRPTR, STRPTR);
Prototype BOOL Batch(STRPTR, UBYTE);
Prototype BOOL BatchEdit(STRPTR);
Prototype BOOL BatchDelete(STRPTR);
Prototype BOOL BatchDir(VOID);
Prototype BOOL AddSelEntry(UWORD);
Prototype BOOL DelSelEntry(VOID);
Prototype BOOL ListSelFile(VOID);
Prototype BOOL ExecSelFile(UWORD);
Prototype BOOL AddKillEntry(UWORD);
Prototype BOOL DelKillEntry(VOID);
Prototype BOOL ListKillFile(VOID);
Prototype BOOL ExecKillFile(VOID);
Prototype BOOL AddAliasEntry(UWORD);
Prototype BOOL DelAliasEntry(VOID);
Prototype BOOL ListAliasFile(VOID);
Prototype VOID GetAlias(STRPTR, UWORD, UWORD);
Prototype VOID WordWrap(STRPTR, UWORD, UWORD);
Prototype BOOL LineEditor(STRPTR);
Prototype LONG SystemCall(STRPTR);
Prototype BOOL Copy(STRPTR, STRPTR, BOOL);
LONG IsInteractive(BPTR);
/*****************************
* Externe Globale Variablen *
*****************************/
extern struct KMSBase *KMSBase;
extern struct LocalConfig *KMS_LC;
extern UMSAccount MyUMSAccount, SysUMSAccount;
extern TEXT PathString[];
extern BPTR OldInput;
extern UMSMsgNum Lastmsg;
extern STRPTR RFromName;
extern STRPTR RFromAddr;
extern STRPTR RCreationDate;
extern STRPTR RSubject;
struct TagItem UMSCurrTags[6] =
{
{UMSTAG_RMsgNum, 0},
{UMSTAG_RFromName, &RFromName},
{UMSTAG_RFromAddr, &RFromAddr},
{UMSTAG_RCreationDate, &RCreationDate},
{UMSTAG_RSubject, &RSubject},
{TAG_DONE, 0}
};
extern STRPTR PPArg, PPArg2;
extern UBYTE ShutDown, Plop;
extern TEXT KMSTempDat[];
extern struct UserNode DummyUser;
/*************************************
* Directory-Scan *
*************************************
* I: Dirname, Flags *
* O: Size / -1 (Fehler) *
*************************************/
/// "DirWork"
LONG DirWork(STRPTR dirname, STRPTR pattern, UWORD flag)
{
LONG more;
BPTR mylock;
struct ExAllData *eadata, *ead;
ULONG sum = 0;
TEXT buff[LEN_MAXLINE+1];
STRPTR pattdest = NULL;
UBYTE stop = 0;
if (pattern)
{
pattdest = malloc(strlen(pattern) * 2 + 2);
if (pattdest)
ParsePatternNoCase(pattern, pattdest, strlen(pattern) * 2 + 2);
}
eadata = (struct ExAllData *)AllocMem(LEN_EADATA, MEMF_CLEAR);
if (!eadata)
{
if (pattdest)
free(pattdest);
SystemError("DirWork", "AllocMem");
return -1L;
}
if (!(mylock = Lock(dirname, SHARED_LOCK)))
{
FreeMem(eadata, LEN_EADATA);
if (pattdest)
free(pattdest);
SystemError("DirWork", "Lock");
return -1L;
}
struct ExAllControl *eac = AllocDosObject(DOS_EXALLCONTROL, NULL);
if (!eac)
{
UnLock(mylock);
FreeMem(eadata, LEN_EADATA);
if (pattdest)
free(pattdest);
SystemError("DirWork", "AllocDosObject");
return -1L;
}
eac->eac_LastKey = 0;
eac->eac_MatchString = pattdest;
eac->eac_MatchFunc = NULL;
do {
more = ExAll(mylock, eadata, LEN_EADATA, ED_SIZE, eac);
/* If non-zero is returned, you MUST call ExAll again until
it returns FALSE. */
if (more == DOSFALSE && IoErr() != ERROR_NO_MORE_ENTRIES)
break;
else if (eac->eac_Entries == 0)
continue;
ead = eadata;
do {
sum += ead->ed_Size;
if (!stop && (flag & DWF_LIST))
{
sprintf(buff, "%-30s %7ld\n", ead->ed_Name, ead->ed_Size);
stop = MsgPrint(buff, 0);
}
ead = ead->ed_Next;
} while(ead);
} while(more == DOSTRUE);
FreeDosObject(DOS_EXALLCONTROL, eac);
UnLock(mylock);
FreeMem(eadata, LEN_EADATA);
if (pattdest)
free(pattdest);
return sum;
}
///
/*************************************
* Test, ob Directory existiert *
*************************************
* I: Dirname *
* O: TRUE/FALSE *
*************************************/
/// "DirExists"
BOOL DirExists(STRPTR name)
{
BOOL error;
BPTR mylock;
struct FileInfoBlock *fileinfo = (struct FileInfoBlock *)AllocVec(sizeof(struct FileInfoBlock), MEMF_CLEAR);
if (!fileinfo)
return FALSE;
if (fileinfo && (mylock = Lock(name, ACCESS_READ)))
{
if (Examine(mylock, fileinfo))
{
if (fileinfo->fib_DirEntryType <= 0) /* Not a directory */
error = TRUE;
else
error = FALSE;
}
else
error = TRUE;
UnLock(mylock);
}
else
error = TRUE;
FreeVec(fileinfo);
if (error)
return FALSE;
else
return TRUE;
}
///
/*************************************
* Test, ob Datei bzw. Dir existiert *
*************************************
* I: Dateiname *
* O: TRUE/FALSE *
*************************************/
/// "Exists"
BOOL Exists(STRPTR name)
{
BPTR lock;
if (lock=Lock(name, ACCESS_READ))
{
UnLock(lock);
return TRUE;
}
return FALSE;
}
///
/********************************
* Datei senden *
********************************
* I: Name, Flags *
* O: --- *
********************************/
/// "SendFile"
BOOL SendFile(STRPTR name, UWORD flag)
{
FILE *sendung;
BYTE more;
UBYTE linecount = 0;
UWORD lfflag;
BOOL weiter = TRUE, continuous = FALSE, newline = FALSE;
TEXT dosbuff[LEN_DOSPATH+1];
TEXT line[LEN_SENDFILE+1];
if (strchr(name, '/') || strchr(name, ':'))
strcpy(dosbuff, name);
else
{
strcpy(dosbuff, KMSBase->TxtDir);
strcat(dosbuff, name);
}
if (flag & SF_CHOOSEEXT)
{
if (KMS_LC->Session.CurrentUser->UserData.Flags & UF_EMU_ANSI)
strcat(dosbuff, ".ANSI");
else
strcat(dosbuff, ".TXT");
if (!Exists(dosbuff))
{
if (strchr(name, '/') || strchr(name, ':'))
strcpy(dosbuff, name);
else
{
strcpy(dosbuff, KMSBase->TxtDir);
strcat(dosbuff, name);
}
strcat(dosbuff, ".TXT");
}
}
if (sendung = fopen(dosbuff, "r"))
{
while(weiter && fgets(line, sizeof(line), sendung))
{
/* LF am Zeilenende entfernen */
if (line[strlen(line)-1] == '\n')
{
newline = TRUE;
line[strlen(line)-1] = '\0';
lfflag = 0;
}
else
{
newline = FALSE;
lfflag = PF_NOLF;
}
/* Zeile senden */
if (ParsePrint(line, PF_CTRLX|PF_CTRLC|lfflag))
weiter = FALSE;
if (!continuous && newline && KMS_LC->Session.CurrentUser->UserData.PageLen)
{
linecount++;
if (linecount + 1 == KMS_LC->Session.CurrentUser->UserData.PageLen)
{
linecount = 0;
more = MoreRequest();
if (more < 0)
continuous = TRUE;
else if (more == 0)
weiter = FALSE;
}
}
}
fclose(sendung);
return TRUE;
}
return FALSE;
}
///
/********************************
* Logbuch-Eintrag *
********************************
* I: Text *
* O: --- *
********************************/
/// "LogEntry"
VOID LogEntry(STRPTR text)
{
TEXT buff[LEN_MAXLINE+1];
TEXT outtext[LEN_LOGLINE+1];
if (text)
{
StdStringParse(text, outtext, LEN_LOGLINE);
sprintf(buff, "LOGENTRY \"%s\"", outtext);
}
else
strcpy(buff, "LOGENTRY");
sendRexxCmd(buff, NULL, NULL, NULL, NULL, "KMS");
}
///
/********************************
* Systemmeldung *
********************************
* I: Msg-Nummer *
* O: --- *
********************************/
/// "SysMsg"
VOID SysMsg(UWORD msgnum)
{
STRPTR startpoint;
TEXT line[LEN_MAXLINE+1];
TEXT buff[LEN_MAXLINE+1];
if (!msgnum || msgnum > MAXSYSMSG)
{
Print("INTERNAL ERROR: [SysMsg] Invalid msgnum", 0);
LogEntry("1INTERNAL ERROR: [SysMsg] Invalid msgnum");
return;
}
if (KMSBase->SysMsgs)
{
startpoint = KMSBase->SysMsgs + KMSBase->SysMsgOffsets[msgnum-1];
if (startpoint)
{
while((startpoint = GetSysMsgLine(startpoint, line, LEN_MAXLINE)) && *line != '@')
{
if (strlen(line))
{
if (strrchr("0123456789", *line))
LogEntry(line);
else if (KMS_LC->Session.Echo)
{
if (line[strlen(line)-1] == '|')
{
line[strlen(line)-1] = '\0';
ParsePrint(line, PF_NOLF|PF_NOBRK);
}
else if (line[strlen(line)-1] == '&')
{
TEXT fmt[LEN_NUMBER+3+1];
line[strlen(line)-1] = '\0';
sprintf(fmt, "%%-%ds", KMS_LC->Session.CurrentUser->UserData.LineLen);
sprintf(buff, fmt, line);
ParsePrint(buff, 0);
}
else
ParsePrint(line, 0);
}
}
else if (KMS_LC->Session.Echo)
ParsePrint(line, 0);
}
}
else
{
Print("INTERNAL ERROR: [SysMsg] Invalid startpoint", 0);
LogEntry("1INTERNAL ERROR: [SysMsg] Invalid startpoint");
}
}
else
{
Print("INTERNAL ERROR: [SysMsg] Invalid SysMsgs", 0);
LogEntry("1INTERNAL ERROR: [SysMsg] Invalid SysMsgs");
}
}
///
/*******************************************
* Zeile aus SysMsgList lesen *
*******************************************
* I: StartPointer, ZielBuffer, Max. Länge *
* O: Neue Position in SysMsg-Datei *
*******************************************/
/// "GetSysMsgLine"
STRPTR GetSysMsgLine(STRPTR startpoint, STRPTR buff, UWORD maxlen)
{
TEXT c = *(startpoint++);
/* Zeile einlesen */
maxlen++;
while(c != '\n' && c > 0 && --maxlen)
{
*(buff++) = c;
c = *(startpoint++);
}
*buff = '\0';
/* Falls Zeile zu lang, Rest der Zeile ueberlesen */
if (c != '\n')
while(c != '\n' && c > 0)
c = *(startpoint++);
if (c == '\n')
return startpoint;
else
return NULL;
}
///
/*****************************************
* Leerzeichen am Stringende abschneiden *
*****************************************
* I: String *
* O: --- *
*****************************************/
/// "TrimString"
VOID TrimString(STRPTR string)
{
WORD n;
if (string && strlen(string))
{
n = strlen(string) - 1;
while(string[n] == ' ')
n--;
string[n+1] = '\0';
}
}
///
/****************************
* Allgemeiner Systemfehler *
****************************
* I: Fehler-Ort, Text *
* O: --- *
****************************/
/// "SystemError"
VOID SystemError(STRPTR loc, STRPTR text)
{
TEXT buff[LEN_LOGLINE+1];
SysMsg(SYSEVENT);
SysMsg(SYSTEM_FAILURE);
if (loc && text)
{
if (strlen(loc)+strlen(text)+15 <= LEN_LOGLINE)
sprintf(buff, "1SysError: [%s]: %s", loc, text);
else if (strlen(loc)+13 <= LEN_LOGLINE)
sprintf(buff, "1SysError: [%s]", loc);
else if (strlen(text)+11 <= LEN_LOGLINE)
sprintf(buff, "1SysError: %s", text);
else
sprintf(buff, "1SysError: [...] ...");
}
else
sprintf(buff, "1SysError: ???");
LogEntry(buff);
Error(buff+1);
if (MyUMSAccount)
{
if (UMSErrNum(MyUMSAccount))
{
strcpy(buff, "1UMSError: ");
strncat(buff, UMSErrTxt(MyUMSAccount), LEN_LOGLINE-strlen(buff));
buff[LEN_LOGLINE] = '\0';
LogEntry(buff);
Error(buff+1);
}
}
if (SysUMSAccount)
{
if (UMSErrNum(SysUMSAccount))
{
strcpy(buff, "1UMSError: ");
strncat(buff, UMSErrTxt(SysUMSAccount), LEN_LOGLINE-strlen(buff));
buff[LEN_LOGLINE] = '\0';
LogEntry(buff);
Error(buff+1);
}
}
}
///
/****************************
* Dateifehler *
****************************
* I: Fehler-Ort, Dateiname *
* O: --- *
****************************/
/// "FileError"
VOID FileError(STRPTR loc, STRPTR file)
{
TEXT buff[LEN_LOGLINE+1];
if (loc && file)
{
if (strlen(loc)+strlen(file)+16 <= LEN_LOGLINE)
sprintf(buff, "1FileError: [%s]: %s", loc, file);
else if (strlen(loc)+14 <= LEN_LOGLINE)
sprintf(buff, "1FileError: [%s]", loc);
else if (strlen(file)+12 <= LEN_LOGLINE)
sprintf(buff, "1FileError: %s", file);
else
sprintf(buff, "1FileError: [...] ...");
}
else
sprintf(buff, "1FileError: ???");
LogEntry(buff);
Error(buff);
}
///
/********************************
* Kommandoprozeduren ausführen *
********************************
* I: Dateiname *
* O: Erfolg Ja/Nein *
********************************/
/// "Batch"
BOOL Batch(STRPTR comfile, UBYTE flag)
{
FILE *datei;
TEXT line[LEN_CMDINPUT+2];
TEXT dosbuff[LEN_DOSPATH+1];
UWORD level = KMS_LC->Session.CurrentUser->UserData.Level;
BOOL keepgoing = TRUE;
if (!strstr(comfile, ".COM"))
return FALSE;
if (flag & BATCH_SYS)
strcpy(dosbuff, KMSBase->UserDir);
else
{
strcpy(dosbuff, KMSBase->UserDir);
strcat(dosbuff, KMS_LC->Session.CurrentUser->UserData.Name);
strcat(dosbuff, "/");
}
strcat(dosbuff, comfile);
ConvertSpace(dosbuff);
if (datei = fopen(dosbuff, "r"))
{
if (flag & BATCH_SYS) /* Level temporaer auf Maximum */
KMS_LC->Session.CurrentUser->UserData.Level = 255;
while(keepgoing && fgets(line, LEN_CMDINPUT+2, datei))
{
if (strlen(line) && line[0] != ';' && line[0] != '\n')
{
line[strlen(line)-1] = '\0';
strcpy(KMS_LC->Session.InputBuffer, line);
keepgoing = CmdInterpreter();
}
}
fclose(datei);
if (flag & BATCH_SYS) /* Level wieder normal */
KMS_LC->Session.CurrentUser->UserData.Level = level;
return TRUE;
}
return FALSE;
}
///
/********************************
* Kommandoprozeduren editieren *
********************************
* I: Dateiname *
* O: OK/Fehler *
********************************/
/// "BatchEdit"
BOOL BatchEdit(STRPTR datei)
{
TEXT dosbuff[LEN_DOSPATH+1];
TEXT outbuff[LEN_PARSEOUT+1];
TEXT cfgstring[20];
STRPTR editor;
TEXT sizebuff[LEN_NUMBER+1];
LONG quota;
if (!strchr(datei, '/') && !strchr(datei, ':'))
{
strcpy(dosbuff, KMSBase->UserDir);
strcat(dosbuff, KMS_LC->Session.CurrentUser->UserData.Name);
ConvertSpace(dosbuff);
quota = DirWork(dosbuff, "~(#?.KMS)", 0);
quota = KMS_LC->Session.CurrentUser->UserData.Quota * 1024L - quota;
if (quota > 0 && quota < SIZE_QUOTAWARN)
{
sprintf(sizebuff, "%ld", quota);
PPArg = sizebuff;
SysMsg(QUOTA_WARNING);
PPArg = NULL;
}
else if (quota < 0)
{
SysMsg(QUOTA_EXCEEDED);
return FALSE;
}
strcat(dosbuff, "/");
}
else
strcpy(dosbuff, "");
strcat(dosbuff, datei);
if (KMS_LC->Device & DEV_CONSOLE)
strcpy(cfgstring, "KMS.coneditor");
else
strcpy(cfgstring, "KMS.remoteeditor");
if ((KMS_LC->Session.CurrentUser->UserData.Flags & UF_SCREEN_ED) && (editor = ReadUMSConfigTags(SysUMSAccount, UMSTAG_CfgName, cfgstring, TAG_DONE)))
{
PPArg = dosbuff;
PPArg2 = datei;
StdStringParse(editor, outbuff, LEN_PARSEOUT);
PPArg = NULL;
PPArg2 = NULL;
FreeUMSConfig(SysUMSAccount, editor);
SystemCall(outbuff);
/* Alle CRs in LFs wandeln */
/*
if (KMS_LC->Device & DEV_SERIAL)
{
FILE *dat;
STRPTR text;
struct stat stat_buf;
WORD error = stat(dosbuff, &stat_buf);
if (error == 0 && (dat = fopen(dosbuff, "r")))
{
text = (STRPTR)malloc(stat_buf.st_size+1);
if (text)
{
fread(text, 1, stat_buf.st_size, dat);
text[stat_buf.st_size] = '\0';
fclose(dat);
STRPTR pointer = text;
while(*pointer)
{
if (*pointer == '\r')
*pointer = '\n';
pointer++;
}
dat = fopen(dosbuff, "w");
if (dat)
fwrite(text, 1, stat_buf.st_size, dat);
free(text);
}
fclose(dat);
}
}
*/
}
else
return LineEditor(dosbuff);
return TRUE;
}
///
/********************************
* Kommandoprozeduren loeschen *
********************************
* I: Dateiname *
* O: OK/Fehler *
********************************/
/// "BatchDelete"
BOOL BatchDelete(STRPTR datei)
{
TEXT dosbuff[LEN_DOSPATH+1];
sprintf(dosbuff, "%s%s/%s",
KMSBase->UserDir,
KMS_LC->Session.CurrentUser->UserData.Name,
datei);
ConvertSpace(dosbuff);
return DeleteFile(dosbuff);
}
///
/********************************
* Kommandoprozeduren auflisten *
********************************
* I: --- *
* O: OK/Fehler *
********************************/
/// "BatchDir"
BOOL BatchDir(VOID)
{
TEXT dosbuff[LEN_DOSPATH+1];
TEXT buff1[LEN_NUMBER+1];
TEXT buff2[LEN_NUMBER+1];
LONG size, frei;
strcpy(dosbuff, KMSBase->UserDir);
strcat(dosbuff, KMS_LC->Session.CurrentUser->UserData.Name);
ConvertSpace(dosbuff);
SysMsg(BATCHLST_HEAD);
KMS_LC->Session.LineCounter = 6;
size = DirWork(dosbuff, NULL, DWF_LIST);
if (size >= 0)
{
frei = KMS_LC->Session.CurrentUser->UserData.Quota * 1024L - size;
if (frei < 0)
frei = 0;
sprintf(buff1, "%ld", size);
sprintf(buff2, "%ld", frei);
PPArg = buff1;
PPArg2 = buff2;
SysMsg(BATCHDIR_FREE);
PPArg2 = NULL;
PPArg = NULL;
}
return TRUE;
}
///
/***************************************
* Auto-Select-Eintrag aufnehmen *
***************************************
* I: Flag *
* O: Fehler: FALSE *
***************************************/
/// "AddSelEntry"
BOOL AddSelEntry(UWORD flag)
{
FILE *datei;
TEXT dosbuff[LEN_DOSPATH+1];
TEXT namsubj[LEN_REALNAME+LEN_SUBJECT+1];
TEXT line[LEN_SELLINE+2];
TEXT typ;
sprintf(dosbuff, "%s%s/SELECT.KMS",
KMSBase->UserDir,
KMS_LC->Session.CurrentUser->UserData.Name);
ConvertSpace(dosbuff);
if (flag & (HSF_CURRFROM|HSF_CURRSUBJ))
{
if (!Lastmsg)
{
SysMsg(NO_MSG_READ);
return FALSE;
}
UMSCurrTags[0].ti_Data = Lastmsg;
if (!ReadUMSMsg(MyUMSAccount, &UMSCurrTags[0]))
{
SystemError("AddSelEntry", "ReadUMSMsg");
return FALSE;
}
}
if (flag & HSF_CURRFROM)
typ = '<';
else if (flag & HSF_CURRSUBJ)
typ = '=';
else
{
CmdInput(NULL, PROMPT_HSF_ADDTYPE, "<=", NULL, 1, INF_PROMPT);
if (Plop || ShutDown)
{
if (flag & (HSF_CURRFROM|HSF_CURRSUBJ))
FreeUMSMsg(MyUMSAccount, Lastmsg);
return FALSE;
}
typ = *KMS_LC->Session.InputBuffer;
}
if (typ)
{
if (flag & HSF_CURRFROM)
{
if (RFromName)
strncpy(namsubj, RFromName, LEN_REALNAME);
else
*namsubj = '\0';
namsubj[LEN_REALNAME] = '\0';
}
else if (flag & HSF_CURRSUBJ)
{
if (RSubject)
strncpy(namsubj, RSubject, LEN_SUBJECT);
else
*namsubj = '\0';
namsubj[LEN_SUBJECT] = '\0';
}
else
*namsubj = '\0';
if (typ == '<')
CmdInput(NULL, PROMPT_HSF_ADDNAME, NULL, namsubj, LEN_REALNAME, INF_PROMPT|INF_DEFBUF);
else
CmdInput(NULL, PROMPT_HSF_ADDSUBJ, NULL, namsubj, LEN_SUBJECT, INF_PROMPT|INF_DEFBUF);
if (Plop || ShutDown)
{
if (flag & (HSF_CURRFROM|HSF_CURRSUBJ))
FreeUMSMsg(MyUMSAccount, Lastmsg);
return FALSE;
}
if (*KMS_LC->Session.InputBuffer)
{
if (typ == '=')
sprintf(line, "%c %d %s\n", typ, KMS_LC->Session.CurrentArea->AreaData.ID, KMS_LC->Session.InputBuffer);
else
sprintf(line, "%c 0 %s\n", typ, KMS_LC->Session.InputBuffer);
if (datei = fopen(dosbuff, "a"))
{
fputs(line, datei);
SysMsg(HSF_ENTRY_ADDED);
fclose(datei);
}
else
{
FileError("AddSelEntry", dosbuff);
if (flag & (HSF_CURRFROM|HSF_CURRSUBJ))
FreeUMSMsg(MyUMSAccount, Lastmsg);
return FALSE;
}
}
}
/* Evt. Message freigeben */
if (flag & (HSF_CURRFROM|HSF_CURRSUBJ))
FreeUMSMsg(MyUMSAccount, Lastmsg);
return TRUE;
}
///
/***************************************
* Auto-Select-Eintrag löschen *
***************************************
* I: --- *
* O: Fehler/Leer: FALSE *
***************************************/
/// "DelSelEntry"
BOOL DelSelEntry(VOID)
{
FILE *datei, *tempdat;
TEXT dosbuff[LEN_DOSPATH+1];
TEXT line[LEN_SELLINE+2];
UWORD num = 0;
sprintf(dosbuff, "%s%s/SELECT.KMS",
KMSBase->UserDir,
KMS_LC->Session.CurrentUser->UserData.Name);
ConvertSpace(dosbuff);
if (datei = fopen(dosbuff, "r"))
{
UWORD result = CmdInput(NULL, PROMPT_HSF_DELNUM, NULL, NULL, 3, INF_PROMPT|INF_NUMERIC);
if (Plop || ShutDown)
{
fclose(datei);
return FALSE;
}
if (result)
{
if (tempdat = fopen(KMSTempDat, "w"))
{
while(fgets(line, LEN_SELLINE+2, datei))
{
if (strlen(line) > 3 && *line != ';' && *line != '\n')
{
num++;
if (num != result)
fputs(line, tempdat);
}
else
fputs(line, tempdat);
}
fclose(tempdat);
}
else
{
FileError("DelSelEntry", KMSTempDat);
fclose(datei);
return FALSE;
}
fclose(datei);
if (tempdat = fopen(KMSTempDat, "r"))
{
if (datei = fopen(dosbuff, "w"))
{
while(fgets(line, LEN_SELLINE+2, tempdat))
fputs(line, datei);
SysMsg(HSF_ENTRY_DELETED);
fclose(datei);
}
else
FileError("DelSelEntry", dosbuff);
fclose(tempdat);
}
else
{
FileError("DelSelEntry", KMSTempDat);
return FALSE;
}
}
else
fclose(datei);
}
else
{
SysMsg(HSF_NOT_FOUND);
return FALSE;
}
return TRUE;
}
///
/***************************************
* Auto-Select-Einträge auflisten *
***************************************
* I: --- *
* O: Fehler/Leer: FALSE *
***************************************/
/// "ListSelFile"
BOOL ListSelFile(VOID)
{
FILE *datei;
TEXT dosbuff[LEN_DOSPATH+1];
TEXT namsubj[LEN_REALNAME+LEN_SUBJECT+1];
TEXT line[LEN_SELLINE+2];
TEXT typ[2];
UWORD areaid;
UWORD num = 0;
ULONG pos;
sprintf(dosbuff, "%s%s/SELECT.KMS",
KMSBase->UserDir,
KMS_LC->Session.CurrentUser->UserData.Name);
ConvertSpace(dosbuff);
if (datei = fopen(dosbuff, "r"))
{
while(fgets(line, LEN_SELLINE+2, datei))
{
if (strlen(line) > 3 && line[0] != ';' && line[0] != '\n')
{
num++;
line[strlen(line)-1] = '\0';
pos = 0;
areaid = 0;
*typ = '\0';
*namsubj = '\0';
sscanf(line, "%s %hd %n", typ, &areaid, &pos);
strcpy(namsubj, line+pos);
CreatePath(SetArea(areaid));
sprintf(line, "%2d %s %-35s %s", num, typ, PathString, namsubj);
Print(line, 0);
}
}
fclose(datei);
}
if (!num)
SysMsg(HSF_NOT_FOUND);
return (BOOL)num;
}
///
/***************************************
* Auto-Select-File bearbeiten *
***************************************
* I: Flag *
* O: Fehler/Leer: FALSE *
***************************************/
/// "ExecSelFile"
BOOL ExecSelFile(UWORD flag)
{
FILE *datei;
TEXT dosbuff[LEN_DOSPATH+1];
TEXT namsubj[LEN_REALNAME+LEN_SUBJECT+1];
TEXT line[LEN_SELLINE+2];
TEXT typ[2];
UWORD num = 0;
UWORD areaid;
ULONG pos;
sprintf(dosbuff, "%s%s/SELECT.KMS",
KMSBase->UserDir,
KMS_LC->Session.CurrentUser->UserData.Name);
ConvertSpace(dosbuff);
SysMsg(PRESELECT_RUNNING);
MsgSelect(MS_RESET|MS_QUIET, NULL);
MsgSelect(MS_DEFAULT|MS_QUIET, NULL);
if (datei = fopen(dosbuff, "r"))
{
while(fgets(line, LEN_SELLINE+2, datei))
{
if (strlen(line) > 3 && line[0] != ';' && line[0] != '\n')
{
num++;
line[strlen(line)-1] = '\0';
pos = 0;
areaid = 0;
*typ = '\0';
*namsubj = '\0';
sscanf(line, "%s %hd %n", typ, &areaid, &pos);
strcpy(namsubj, line+pos);
if (*namsubj)
{
switch(*typ)
{
case '<':
MsgSelect(MS_FROM|MS_QUIET, namsubj);
break;
case '=':
struct AreaNode *anode;
TakeASem(FALSE);
if (anode = SetArea(areaid))
{
DropASem();
SelectArea(anode->AreaData.MBName);
MsgSelect(MS_SUBJECT|MS_QUIET, namsubj);
SelectArea(KMS_LC->Session.CurrentArea->AreaData.MBName);
}
else
{
DropASem();
SysMsg(AREA_NOT_FOUND);
}
break;
default:
break;
}
}
}
}
fclose(datei);
}
LONG result;
if (flag & HSF_NEWS)
MsgSelect(MS_NEW|MS_QUIET, NULL);
if (result = MsgSelect(MS_RESULT|MS_QUIET, NULL))
{
sprintf(dosbuff, "%ld", result);
PPArg = dosbuff;
SysMsg(SELECT_RESULT);
PPArg = NULL;
}
else
SysMsg(NO_MSG_SELECTED);
return (BOOL)num;
}
///
/***************************************
* Auto-Kill-Eintrag aufnehmen *
***************************************
* I: Flag *
* O: Fehler: FALSE *
***************************************/
/// "AddKillEntry"
BOOL AddKillEntry(UWORD flag)
{
FILE *datei;
TEXT dosbuff[LEN_DOSPATH+1];
TEXT nasupa[LEN_KMSPATH+1];
TEXT line[LEN_KILLINE+2];
TEXT typ;
struct AreaNode *anode;
sprintf(dosbuff, "%s%s/KILL.KMS",
KMSBase->UserDir,
KMS_LC->Session.CurrentUser->UserData.Name);
ConvertSpace(dosbuff);
if (flag & (HKF_CURRFROM|HKF_CURRSUBJ))
{
if (!Lastmsg)
{
SysMsg(NO_MSG_READ);
return FALSE;
}
UMSCurrTags[0].ti_Data = Lastmsg;
if (!ReadUMSMsg(MyUMSAccount, &UMSCurrTags[0]))
{
SystemError("AddKillEntry", "ReadUMSMsg");
return FALSE;
}
}
if (flag & HKF_CURRFROM)
{
if (flag & HKF_GLOBAL)
typ = '*';
else
typ = '<';
}
else if (flag & HKF_CURRSUBJ)
typ = '=';
else if (flag & HKF_CURRAREA)
typ = '#';
else
{
CmdInput(NULL, PROMPT_HKF_ADDTYPE, "<=#*", NULL, 1, INF_PROMPT);
if (Plop || ShutDown)
{
if (flag & (HKF_CURRFROM|HKF_CURRSUBJ))
FreeUMSMsg(MyUMSAccount, Lastmsg);
return FALSE;
}
typ = *KMS_LC->Session.InputBuffer;
}
if (typ)
{
if (flag & HKF_CURRFROM)
{
if (RFromName)
strncpy(nasupa, RFromName, LEN_REALNAME);
else
*nasupa = '\0';
nasupa[LEN_REALNAME] = '\0';
}
else if (flag & HKF_CURRSUBJ)
{
if (RSubject)
strncpy(nasupa, RSubject, LEN_SUBJECT);
else
*nasupa = '\0';
nasupa[LEN_SUBJECT] = '\0';
}
else if (flag & HKF_CURRAREA)
{
CreatePath(KMS_LC->Session.CurrentArea);
strcpy(nasupa, PathString);
}
else
*nasupa = '\0';
if (typ == '#')
{
if (flag & HKF_CURRAREA)
strcpy(PathString, nasupa);
else
*PathString = '\0';
strcpy(KMS_LC->Session.InputBuffer, " ");
while(strlen(KMS_LC->Session.InputBuffer) && stricmp(PathString, KMS_LC->Session.InputBuffer))
{
CmdInput(NULL, PROMPT_HKF_ADDPATH, NULL, PathString, LEN_KMSPATH, INF_PROMPT|INF_UPCASE|INF_DEFBUF);
if (Plop || ShutDown)
{
if (flag & (HSF_CURRFROM|HSF_CURRSUBJ))
FreeUMSMsg(MyUMSAccount, Lastmsg);
return FALSE;
}
if (strlen(KMS_LC->Session.InputBuffer))
{
if (anode = ChangeArea(KMS_LC->Session.InputBuffer))
if (anode->AreaData.ID != 1)
CreatePath(anode);
}
}
}
else if (typ == '<' || typ == '*')
CmdInput(NULL, PROMPT_HKF_ADDNAME, NULL, nasupa, LEN_REALNAME, INF_PROMPT|INF_DEFBUF);
else
CmdInput(NULL, PROMPT_HKF_ADDSUBJ, NULL, nasupa, LEN_SUBJECT, INF_PROMPT|INF_DEFBUF);
if (Plop || ShutDown)
{
if (flag & (HSF_CURRFROM|HSF_CURRSUBJ))
FreeUMSMsg(MyUMSAccount, Lastmsg);
return FALSE;
}
if (*KMS_LC->Session.InputBuffer)
{
if (typ == '#')
sprintf(line, "# %d #?\n", anode->AreaData.ID);
else if (typ == '*')
sprintf(line, "%c 0 %s\n", typ, KMS_LC->Session.InputBuffer);
else
sprintf(line, "%c %d %s\n", typ, KMS_LC->Session.CurrentArea->AreaData.ID, KMS_LC->Session.InputBuffer);
if (datei = fopen(dosbuff, "a"))
{
fputs(line, datei);
SysMsg(HKF_ENTRY_ADDED);
fclose(datei);
}
else
{
FileError("AddKillEntry", dosbuff);
if (flag & (HKF_CURRFROM|HKF_CURRSUBJ))
FreeUMSMsg(MyUMSAccount, Lastmsg);
return FALSE;
}
}
}
/* Evt. Message freigeben */
if (flag & (HKF_CURRFROM|HKF_CURRSUBJ))
FreeUMSMsg(MyUMSAccount, Lastmsg);
return TRUE;
}
///
/***************************************
* Auto-Kill-Eintrag löschen *
***************************************
* I: --- *
* O: Fehler/Leer: FALSE *
***************************************/
/// "DelKillEntry"
BOOL DelKillEntry(VOID)
{
FILE *datei, *tempdat;
TEXT dosbuff[LEN_DOSPATH+1];
TEXT line[LEN_KILLINE+2];
UWORD num = 0;
sprintf(dosbuff, "%s%s/KILL.KMS",
KMSBase->UserDir,
KMS_LC->Session.CurrentUser->UserData.Name);
ConvertSpace(dosbuff);
if (datei = fopen(dosbuff, "r"))
{
UWORD result = CmdInput(NULL, PROMPT_HKF_DELNUM, NULL, NULL, 3, INF_PROMPT|INF_NUMERIC);
if (Plop || ShutDown)
{
fclose(datei);
return FALSE;
}
if (result)
{
if (tempdat = fopen(KMSTempDat, "w"))
{
while(fgets(line, LEN_KILLINE+2, datei))
{
if (strlen(line) > 3 && line[0] != ';' && line[0] != '\n')
{
num++;
if (num != result)
fputs(line, tempdat);
}
else
fputs(line, tempdat);
}
fclose(tempdat);
}
else
{
FileError("DelKillEntry", KMSTempDat);
fclose(datei);
return FALSE;
}
fclose(datei);
if (tempdat = fopen(KMSTempDat, "r"))
{
if (datei = fopen(dosbuff, "w"))
{
while(fgets(line, LEN_KILLINE+2, tempdat))
fputs(line, datei);
SysMsg(HKF_ENTRY_DELETED);
fclose(datei);
}
else
FileError("DelKillEntry", dosbuff);
fclose(tempdat);
}
else
{
FileError("DelKillEntry", KMSTempDat);
return FALSE;
}
}
else
fclose(datei);
}
else
{
SysMsg(HKF_NOT_FOUND);
return FALSE;
}
return TRUE;
}
///
/***************************************
* Auto-Kill-Einträge auflisten *
***************************************
* I: --- *
* O: Fehler/Leer: FALSE *
***************************************/
/// "ListKillFile"
BOOL ListKillFile(VOID)
{
FILE *datei;
TEXT dosbuff[LEN_DOSPATH+1];
TEXT nasupa[LEN_KMSPATH+1];
TEXT line[LEN_KILLINE+2];
TEXT typ[2];
UWORD areaid;
UWORD num = 0;
ULONG pos;
sprintf(dosbuff, "%s%s/KILL.KMS",
KMSBase->UserDir,
KMS_LC->Session.CurrentUser->UserData.Name);
ConvertSpace(dosbuff);
if (datei = fopen(dosbuff, "r"))
{
while(fgets(line, LEN_KILLINE+2, datei))
{
if (strlen(line) > 3 && line[0] != ';' && line[0] != '\n')
{
num++;
line[strlen(line)-1] = '\0';
pos = 0;
areaid = 0;
*typ = '\0';
*nasupa = '\0';
sscanf(line, "%s %hd %n", typ, &areaid, &pos);
strcpy(nasupa, line+pos);
if (areaid)
CreatePath(SetArea(areaid));
else
strcpy(PathString, "*");
sprintf(line, "%2d %s %-35s %s", num, typ, PathString, nasupa);
Print(line, 0);
}
}
fclose(datei);
}
if (!num)
SysMsg(HKF_NOT_FOUND);
return (BOOL)num;
}
///
/***************************************
* Auto-Kill-File bearbeiten *
***************************************
* I: --- *
* O: Fehler/Leer: FALSE *
***************************************/
/// "ExecKillFile"
BOOL ExecKillFile(VOID)
{
FILE *datei;
TEXT dosbuff[LEN_DOSPATH+1];
TEXT nasupa[LEN_KMSPATH+1];
TEXT line[LEN_KILLINE+2];
TEXT typ[2];
UWORD areaid;
UWORD num = 0;
ULONG sum = 0;
ULONG pos;
sprintf(dosbuff, "%s%s/KILL.KMS",
KMSBase->UserDir,
KMS_LC->Session.CurrentUser->UserData.Name);
ConvertSpace(dosbuff);
SysMsg(PREREAD_RUNNING);
if (datei = fopen(dosbuff, "r"))
{
while(fgets(line, LEN_KILLINE+2, datei))
{
if (strlen(line) > 3 && line[0] != ';' && line[0] != '\n')
{
num++;
line[strlen(line)-1] = '\0';
pos = 0;
areaid = 0;
*typ = '\0';
*nasupa = '\0';
sscanf(line, "%s %hd %n", typ, &areaid, &pos);
strcpy(nasupa, line+pos);
if (areaid && *nasupa)
{
struct AreaNode *anode;
TakeASem(FALSE);
if (anode = SetArea(areaid))
{
DropASem();
SelectArea(anode->AreaData.MBName);
switch(*typ)
{
case '<':
sum += MarkRead(MR_FROM|MR_QUIET, nasupa);
break;
case '=':
sum += MarkRead(MR_THREAD|MR_QUIET, nasupa);
break;
case '#':
sum += MarkRead(MR_AREA|MR_QUIET, anode->AreaData.MBName);
break;
default:
break;
}
}
else
{
DropASem();
SysMsg(AREA_NOT_FOUND);
}
}
else if (*nasupa)
{
if (*typ == '*')
sum += MarkRead(MR_FROM|MR_GLOBAL|MR_QUIET, nasupa);
}
}
}
SelectArea(KMS_LC->Session.CurrentArea->AreaData.MBName);
fclose(datei);
}
if (sum)
{
sprintf(line, "%ld", sum);
PPArg = line;
SysMsg(PREREAD_RESULT);
PPArg = NULL;
}
else
SysMsg(NO_MSG_PREREAD);
return (BOOL)num;
}
///
/***************************************
* Alias-Eintrag aufnehmen *
***************************************
* I: Flag *
* O: Fehler: FALSE *
***************************************/
/// "AddAliasEntry"
BOOL AddAliasEntry(UWORD flag)
{
FILE *datei;
TEXT dosbuff[LEN_DOSPATH+1];
TEXT line[LEN_ALIASLINE+2];
TEXT nam[LEN_REALNAME+1];
TEXT alias[LEN_ALIAS+1];
TEXT adr[LEN_ADDRESS+1];
sprintf(dosbuff, "%s%s/ALIAS.KMS",
KMSBase->UserDir,
KMS_LC->Session.CurrentUser->UserData.Name);
ConvertSpace(dosbuff);
if (flag & GA_CURRENT)
{
if (!Lastmsg)
{
SysMsg(NO_MSG_READ);
return FALSE;
}
UMSCurrTags[0].ti_Data = Lastmsg;
if (!ReadUMSMsg(MyUMSAccount, &UMSCurrTags[0]))
{
SystemError("AddAliasEntry", "ReadUMSMsg");
return FALSE;
}
}
CmdInput(NULL, PROMPT_GA_ALIAS, NULL, NULL, LEN_ALIAS, INF_PROMPT);
if (Plop || ShutDown || !*KMS_LC->Session.InputBuffer)
{
if (flag & GA_CURRENT)
FreeUMSMsg(MyUMSAccount, Lastmsg);
return FALSE;
}
strcpy(alias, KMS_LC->Session.InputBuffer);
if (flag & GA_CURRENT)
{
if (RFromName)
strncpy(nam, RFromName, LEN_REALNAME);
else
*nam = '\0';
nam[LEN_REALNAME] = '\0';
}
else
*nam = '\0';
CmdInput(NULL, PROMPT_GA_NAME, NULL, nam, LEN_REALNAME, INF_PROMPT|INF_DEFBUF);
if (Plop || ShutDown)
{
if (flag & GA_CURRENT)
FreeUMSMsg(MyUMSAccount, Lastmsg);
return FALSE;
}
strcpy(nam, KMS_LC->Session.InputBuffer);
if (flag & GA_CURRENT)
{
if (RFromAddr)
strncpy(adr, RFromAddr, LEN_ADDRESS);
else
*adr = '\0';
adr[LEN_ADDRESS] = '\0';
}
else
*adr = '\0';
CmdInput(NULL, PROMPT_GA_ADDRESS, NULL, adr, LEN_ADDRESS, INF_PROMPT|INF_DEFBUF);
if (Plop || ShutDown)
{
if (flag & GA_CURRENT)
FreeUMSMsg(MyUMSAccount, Lastmsg);
return FALSE;
}
if (!*KMS_LC->Session.InputBuffer)
strcpy(KMS_LC->Session.InputBuffer, "-");
sprintf(line, "%s %s %s\n", alias, KMS_LC->Session.InputBuffer, nam);
/* Evt. Message freigeben */
if (flag & GA_CURRENT)
FreeUMSMsg(MyUMSAccount, Lastmsg);
/* Eintrag in Datei */
if (datei = fopen(dosbuff, "a"))
{
fputs(line, datei);
SysMsg(GA_ENTRY_ADDED);
fclose(datei);
}
else
{
FileError("AddAliasEntry", dosbuff);
return FALSE;
}
return TRUE;
}
///
/***************************************
* Alias-Eintrag löschen *
***************************************
* I: --- *
* O: Fehler/Leer: FALSE *
***************************************/
/// "DelAliasEntry"
BOOL DelAliasEntry(VOID)
{
FILE *datei, *tempdat;
TEXT dosbuff[LEN_DOSPATH+1];
TEXT line[LEN_ALIASLINE+2];
UWORD num = 0;
BOOL abort = FALSE;
sprintf(dosbuff, "%s%s/ALIAS.KMS",
KMSBase->UserDir,
KMS_LC->Session.CurrentUser->UserData.Name);
ConvertSpace(dosbuff);
if (datei = fopen(dosbuff, "r"))
{
UWORD result = CmdInput(NULL, PROMPT_GA_DELNUM, NULL, NULL, 3, INF_PROMPT|INF_NUMERIC);
if (Plop || ShutDown)
{
fclose(datei);
return FALSE;
}
if (result)
{
if (tempdat = fopen(KMSTempDat, "w"))
{
while(fgets(line, LEN_ALIASLINE+2, datei))
{
if (strlen(line) > 3 && *line != ';' && *line != '\n')
{
num++;
if (num != result)
fputs(line, tempdat);
}
else
fputs(line, tempdat);
}
fclose(tempdat);
}
else
{
FileError("DelAliasEntry", KMSTempDat);
fclose(datei);
return FALSE;
}
fclose(datei);
if (tempdat = fopen(KMSTempDat, "r"))
{
if (datei = fopen(dosbuff, "w"))
{
while(fgets(line, LEN_ALIASLINE+2, tempdat))
fputs(line, datei);
SysMsg(GA_ENTRY_DELETED);
fclose(datei);
}
else
FileError("DelAliasEntry", dosbuff);
fclose(tempdat);
}
else
{
FileError("DelAliasEntry", KMSTempDat);
return FALSE;
}
}
else
fclose(datei);
}
else
{
SysMsg(GA_NOT_FOUND);
return FALSE;
}
return TRUE;
}
///
/***************************************
* Alias-Einträge auflisten *
***************************************
* I: --- *
* O: Fehler/Leer: FALSE *
***************************************/
/// "ListAliasFile"
BOOL ListAliasFile(VOID)
{
FILE *datei;
TEXT dosbuff[LEN_DOSPATH+1];
TEXT line[LEN_ALIASLINE+2];
TEXT nam[LEN_REALNAME+1];
TEXT alias[LEN_ALIAS+1];
TEXT adr[LEN_ADDRESS+1];
UWORD num = 0;
ULONG pos;
UBYTE stop = 0;
sprintf(dosbuff, "%s%s/ALIAS.KMS",
KMSBase->UserDir,
KMS_LC->Session.CurrentUser->UserData.Name);
ConvertSpace(dosbuff);
if (datei = fopen(dosbuff, "r"))
{
while(!stop && fgets(line, LEN_ALIASLINE+2, datei))
{
if (strlen(line) && *line != ';' && *line != '\n')
{
if (!num)
{
SysMsg(ALIASLIST_HEAD);
KMS_LC->Session.LineCounter = 6;
}
num++;
line[strlen(line)-1] = '\0';
pos = 0;
*adr = '\0';
*alias = '\0';
*nam = '\0';
sscanf(line, "%s %s %n", alias, adr, &pos);
strcpy(nam, line+pos);
if (!strcmp(adr, "-"))
*adr = '\0';
sprintf(line, "%2d %-15s %-30.30s %s\n", num, alias, adr, nam);
stop = MsgPrint(line, 0);
}
}
fclose(datei);
if (!stop)
Print(NULL, 0);
}
if (!num)
SysMsg(GA_NOT_FOUND);
return (BOOL)num;
}
///
/***************************************
* Namen-/Adressen-Eingabe einschl. *
* Alias-Check *
***************************************
* I: Zielpuffer, Flag, Max. Länge *
* O: --- *
***************************************/
/// "GetAlias"
VOID GetAlias(STRPTR txtbuff, UWORD flag, UWORD maxlen)
{
static STRPTR name = NULL;
static STRPTR addr = NULL;
FILE *datei;
TEXT dosbuff[LEN_DOSPATH+1];
TEXT line[LEN_ALIASLINE+2];
UWORD adrpos, nampos;
BOOL ende, abort = FALSE;
BOOL vorgabe = FALSE;
if (flag & GA_RESET || !txtbuff)
{
if (name)
free(name);
if (addr)
free(addr);
name = NULL;
addr = NULL;
return;
}
if (strlen(txtbuff))
vorgabe = TRUE;
*KMS_LC->Session.InputBuffer = '\0';
sprintf(dosbuff, "%s%s/ALIAS.KMS",
KMSBase->UserDir,
KMS_LC->Session.CurrentUser->UserData.Name);
ConvertSpace(dosbuff);
if (flag & GA_NAME)
{
while(!abort && !strlen(KMS_LC->Session.InputBuffer))
{
CmdInput(NULL, PROMPT_TONAME, NULL, txtbuff, LEN_REALNAME, INF_PROMPT|INF_DEFBUF);
if (Plop || ShutDown)
{
*txtbuff = '\0';
return;
}
if (vorgabe)
{
*txtbuff = '\0';
vorgabe = FALSE;
}
/* Name auf Alias pruefen */
if (strlen(KMS_LC->Session.InputBuffer) && strcmp(txtbuff, KMS_LC->Session.InputBuffer) && (datei = fopen(dosbuff, "r")))
{
ende = FALSE;
strcat(KMS_LC->Session.InputBuffer, " "); /* Wegen Alias-Namens-Vergleich */
while(!ende && fgets(line, LEN_ALIASLINE+2, datei))
{
if (strlen(line) > 0 && line[0] != ';' && line[0] != '\n')
{
line[strlen(line)-1] = '\0';
adrpos = nampos = 0;
while(line[adrpos] != '\0' && line[adrpos] != ' ')
adrpos++;
if (line[adrpos])
{
nampos = adrpos + 1;
while(line[nampos] != '\0' && line[nampos] != ' ')
nampos++;
}
if (!strncmp(KMS_LC->Session.InputBuffer, line, adrpos+1))
{
/* Alias gefunden */
adrpos++;
if (addr)
free(addr);
addr = (STRPTR)malloc((size_t)(nampos-adrpos+1));
if (addr) /* Adresse */
{
strncpy(addr, &line[adrpos], nampos-adrpos);
addr[nampos-adrpos] = '\0';
if (!strcmp(addr, "-"))
*addr = '\0';
}
nampos++;
if (name)
free(name);
name = (STRPTR)malloc((size_t)(strlen(line)-nampos+1));
if (name) /* Realname */
{
strncpy(name, &line[nampos], strlen(line)-nampos);
name[strlen(line)-nampos] = '\0';
*KMS_LC->Session.InputBuffer = '\0';
}
ende = TRUE;
}
}
}
KMS_LC->Session.InputBuffer[strlen(KMS_LC->Session.InputBuffer)-1] = '\0'; /* Space wieder weg */
if (!ende) /* Nicht gefunden */
{
if (name)
free(name);
if (addr)
free(addr);
name = NULL;
addr = NULL;
*txtbuff = '\0';
}
if (name)
{
strncpy(txtbuff, name, maxlen);
txtbuff[maxlen] = '\0';
}
fclose(datei);
}
else
abort = TRUE;
}
}
else if (flag & GA_ADDRESS)
{
if (addr)
{
strncpy(txtbuff, addr, maxlen);
txtbuff[maxlen] = '\0';
}
CmdInput(NULL, PROMPT_TOPATH, NULL, txtbuff, LEN_ADDRESS, INF_PROMPT|INF_DEFBUF);
if (Plop || ShutDown)
{
*txtbuff = '\0';
return;
}
}
strncpy(txtbuff, KMS_LC->Session.InputBuffer, maxlen);
txtbuff[maxlen] = '\0';
}
///
/****************************************
* WordWrap *
****************************************
* I: Quell-String, Zeilenlaenge, Flags *
* O: --- *
****************************************/
/// "WordWrap"
VOID WordWrap(STRPTR source, UWORD maxlen, UWORD flags)
{
STRPTR tp = source;
UWORD pos = 0; /* Pos = "Wieviele Zeichen sind bereits ausgegeben?" */
while(*tp)
{
if (*tp == '\n')
pos = 0;
else if (*tp == '\14') /* Form Feed */
{
pos = 0;
if (flags & WW_NOFANCY)
*tp = '\n';
}
else if (*tp == '\t')
{
if ((pos / 8 + 1) * 8 <= maxlen)
pos = (pos / 8 + 1) * 8;
else
{
*tp = '\n';
pos = 0;
}
}
/*
else if ((UBYTE)*tp == 236)
*tp = '\1';
*/
else if (pos < maxlen)
pos++;
else /* Umbrechen */
{
STRPTR merk = tp;
while(tp > source && *tp != ' ' && *tp != '\n' && *tp != '\t' && *tp != '\14')
tp--;
if (*tp == ' ' || *tp == '\t')
{
*tp = '\n';
pos = 0;
}
else
{
tp = merk + 1;
while(*tp && *tp != ' ' && *tp != '\n' && *tp != '\t' && *tp != '\14')
tp++;
if (*tp == ' ' || *tp == '\t')
*tp = '\n';
pos = 0;
}
}
tp++;
}
}
///
/****************************************
* Primitiv-Zeileneditor *
****************************************
* I: Dateiname *
* O: Ok/Fehler TRUE/FALSE *
****************************************/
/// "LineEditor"
BOOL LineEditor(STRPTR datei)
{
BOOL weiter = TRUE;
FILE *fd;
if (fd = fopen(datei, "w"))
{
SysMsg(EDITOR_INIT);
while(weiter)
{
CmdInput(NULL, 0, NULL, NULL, LEN_CMDINPUT, 0);
if (Plop || ShutDown)
{
fclose(fd);
return FALSE;
}
if (!strcmp(KMS_LC->Session.InputBuffer, "."))
weiter = FALSE;
else
{
fputs(KMS_LC->Session.InputBuffer, fd);
fputs("\n", fd);
}
}
fclose(fd);
return TRUE;
}
else
return FALSE;
}
///
/****************************************
* Shell-Kommando *
****************************************
* I: Kommando *
* O: Result-Code *
****************************************/
/// "SystemCall"
LONG SystemCall(STRPTR cmd)
{
LONG result;
/* Konsole in CON: Mode schalten */
if (IsInteractive(KMS_LC->InHandle))
SetMode(KMS_LC->InHandle, 0);
KMS_LC->RawMode = FALSE;
CursorOn();
result = SystemTags(cmd, SYS_Input, KMS_LC->InHandle, SYS_Output, NULL, TAG_DONE);
CursorOff();
/* Konsole in RAW: Mode schalten */
if (IsInteractive(KMS_LC->InHandle))
SetMode(KMS_LC->InHandle, 1);
KMS_LC->RawMode = TRUE;
/* Eventuelles CTRL-C Signal vernichten */
SetSignal(0, SIGBREAKF_CTRL_C);
return result;
}
///
/****************************************
* Copy / Move *
****************************************
* I: From, To, Move-Flag *
* O: Erfolg TRUE/FALSE *
****************************************/
/// "Copy"
BOOL Copy(STRPTR frompath, STRPTR topath, BOOL moveflag)
{
if (!frompath || !topath)
return FALSE;
FILE *from = fopen(frompath, "r");
FILE *to = fopen(topath, "w");
STRPTR cpbuff;
size_t num;
BOOL error = FALSE;
cpbuff = malloc(8192);
if (!cpbuff)
return FALSE;
if (from && to)
{
while(num = fread(cpbuff, 1, 8192, from))
fwrite(cpbuff, 1, num, to);
}
else
error = TRUE;
if (cpbuff)
free(cpbuff);
if (from)
fclose(from);
if (to)
fclose(to);
if (!error && moveflag)
DeleteFile(frompath);
return !error;
}
///